#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
#include <sw/redis++/redis++.h>

void text1(sw::redis::Redis &redis)
{
    std::cout << "set and get" << std::endl;
    // get和set的使用
    redis.flushall(); // 先清空

    redis.set("key1", "123");
    redis.set("key2", "223");
    redis.set("key3", "233");

    auto value1 = redis.get("key1");
    if (value1)
    { // 可以隐式转换成bool类型,为true表示值有效
        std::cout << "value1:" << value1.value() << std::endl;
    }

    auto value2 = redis.get("key2");
    if (value2)
    {
        std::cout << "value2:" << value2.value() << std::endl;
    }

    auto value3 = redis.get("key3");
    if (value3)
    {
        std::cout << "value3:" << value3.value() << std::endl;
    }
    // 对optional的非法状态再取值会抛异常
    auto value4 = redis.get("key4");
    if (value4)
    {
        std::cout << "value4:" << value4.value() << std::endl;
    }
}

void text2(sw::redis::Redis &redis)
{
    std::cout << "exists" << std::endl;
    redis.flushall();

    redis.set("key", "233");

    auto ret = redis.exists("key");
    std::cout << ret << std::endl;

    ret = redis.exists("key2");
    std::cout << ret << std::endl;

    ret = redis.exists({"key", "key1", "key2"});
    std::cout << ret << std::endl;
}

void text3(sw::redis::Redis &redis)
{
    std::cout << "del" << std::endl;

    redis.flushall();

    redis.set("key1", "123");
    redis.set("key2", "233");

    auto ret = redis.del({"key1", "key2", "key3"});
    std::cout << ret << std::endl;

    ret = redis.exists("key1");
    std::cout << ret << std::endl;
}

void text4(sw::redis::Redis &redis)
{
    std::cout << "keys" << std::endl;

    redis.flushall();

    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");
    redis.set("key4", "444");
    redis.set("key5", "555");
    redis.set("key6", "666");

    std::vector<std::string> result;
    auto it = std::back_inserter(result); // 需要一个容器和对应的迭代器
    redis.keys("*", it);
    for (int i = 0; i < result.size(); i++)
        std::cout << result[i] << std::endl;
}

void text5(sw::redis::Redis &redis)
{
    using namespace std::chrono_literals;
    std::cout << "expire and ttl" << std::endl;

    redis.flushall();

    redis.set("key", "233");
    redis.expire("key", std::chrono::seconds(10));

    auto time = redis.ttl("key");
    std::cout << time << std::endl;

    std::this_thread::sleep_for(3s); // 字面值常量，需要使用对应命名空间

    time = redis.ttl("key");
    std::cout << time << std::endl;
}

void text6(sw::redis::Redis &redis)
{
    std::cout << "type" << std::endl;

    redis.flushall();

    redis.set("key", "233");
    auto ret = redis.type("key");
    std::cout << "key: " << ret << std::endl;

    redis.lpush("key2", "111");
    ret = redis.type("key2");
    std::cout << "key2: " << ret << std::endl;

    redis.hset("key3", "acdc", "233");
    ret = redis.type("key3");
    std::cout << "key3: " << ret << std::endl;

    redis.sadd("key4", "herry");
    ret = redis.type("key4");
    std::cout << "key4: " << ret << std::endl;

    redis.zadd("key5", "saber", 123);
    ret = redis.type("key5");
    std::cout << "key5: " << ret << std::endl;
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");

    // text1(redis);
    // text2(redis);
    // text3(redis);
    // text4(redis);
    // text5(redis);
    text6(redis);

    return 0;
}